04_TOPIC MODELLING_with LDA¶
Цель¶
- провести topic modelling c
LDA(Latent Dirichlet Allocation) с метрикойcoherence score
Imports¶
In [1]:
import os
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from pathlib import Path
import logging
import pyLDAvis
import pyLDAvis.gensim_models as gensimvis
from wordcloud import WordCloud
Initialization¶
In [2]:
pd.set_option("display.max_colwidth", None)
plt.style.use("classic")
# Ignore UserWarning specifically
warnings.filterwarnings("ignore", category=UserWarning)
In [3]:
PROJECT_NAME = "finam_topic_modelling"
FILE_INPUT_NAME = "data_with_k_means.parquet"
# Get the current working directory
current_dir = Path.cwd()
# Traverse up to find "finam_text_classification" folder
project_root = current_dir
while project_root.name != PROJECT_NAME:
if project_root.parent == project_root: # Reached the filesystem root
raise FileNotFoundError("The 'finam_text_classification' folder was not found.")
project_root = project_root.parent
# Define the path to the input data relative to the project root
PTH_TO_INPUT_DATA = project_root / "data" / "interim" / FILE_INPUT_NAME
Defs¶
In [4]:
def lda_model_gensim(corpus, dictionary, num_topics):
from gensim import models
ldamodel = models.ldamodel.LdaModel(corpus, id2word=dictionary, eval_every=20, num_topics=num_topics, passes=5)
return ldamodel
In [5]:
def topic_file(topics_gensim_np, file_pth):
list_topic = []
for ind_topiс, topiс in enumerate(topics_gensim_np):
list_word = topiс[1]
for words in list_word:
topic_word = []
topic_word.append(ind_topiс)
topic_word.append(words[0])
topic_word.append(words[1])
list_topic.append(topic_word)
topic_gensim = pd.DataFrame(list_topic, columns=["topic", "word_in topic", "weight_topic"])
topic_gensim.to_parquet(file_pth, index=False)
return topic_gensim
In [6]:
# облако слов топиков для модели gensim
def plotWordCloud(topic_number, topics, head):
"""
Строит визуализацию слов на основе текстов топиков из Gensim
"""
# получаем частоты и слова топика
text = dict(topics[topic_number][1])
# print(head+str(topic_number))
# строим облако слов
wordcloud = WordCloud(background_color="white", max_words=100, width=900, height=900, collocations=False)
wordcloud = wordcloud.generate_from_frequencies(text)
# wordcloud.generate(long_string)
plt.figure(figsize=(15, 10))
plt.title((head + " номер {}").format(topic_number))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
In [7]:
def get_topic(words, lda):
""" """
bag = lda.id2word.doc2bow(words)
topics = lda.get_document_topics(bag)
topic_dictionary = {}
for topic in topics:
topic_dictionary[topic[1]] = str((topic[0]))
main_probability = max(topic_dictionary)
main_topic = topic_dictionary[main_probability]
return [main_topic, main_probability]
Main pipeline¶
Read data¶
In [8]:
# Read data
try:
# Use Path to check if the file exists
if PTH_TO_INPUT_DATA.exists():
# Read the Excel file
df_init = pd.read_parquet(PTH_TO_INPUT_DATA)
logging.info("File successfully loaded.")
else:
# Log an error if the file is not found
logging.error(f"File not found: {PTH_TO_INPUT_DATA}")
except Exception as e:
# Log any exceptions that occur
logging.error(f"An error occurred: {e}")
In [9]:
df_init[["normalized_review_text"]].head(3).T
Out[9]:
| 0 | 1 | 2 | |
|---|---|---|---|
| normalized_review_text | элегантный отель центр <loc> красивый стильный номер жуткий цена посещение отель рекомендоваться ограбить банк неожиданно разбогатеть это писать набрать <num> символ | стиль ваш поездка <loc> это шопинг <loc> молл созерцание фонтан гастрономический ужин пожалеть деньга усилить весь ощущение номер вид фонтан отель <org> это просто супер номер находиться нижний этаж <loc> поэтому вид фонтан оттуда точно хороший улица около хороший крыша это замечательный здание ресторан общий самый хороший прямо будильник заводить выходить смотреть фонтан балкон представление меняться течение вечер балкон курить мочь радовать расстаться привычка номер продавать сайт отель перекупщик тип <misc> номер увидеть реально работать удобный функциональный умный дом управление весь электроника номер <misc> дизайн просто привлекательный интересный очень функциональный сервис честные <num> <misc> мальчик этаж любой вопрос решаться моментально весь очень быстро ненавязчиво шопинг <loc> молл идти галерея ребята сотрудник отель помочь понести сумка отель отнести бояться доверять ценный груз смотровой площадка билет продаваться очередь прямо отель попасть <num> пройти галерея туда обратно контроль безопасность находиться сторона <loc> молл <loc> найти придраться весь вкусно сервис прекрасный общий вывод оказаться <loc> транзит вариант снова сюда | провести супруг уик енд <loc> самый люкс вид фонтан весь уровень отличный панорамный вид фонтан номер шикарный просторный стильный весь чувствоваться качество люкс номер бесплатно предоставить бентли водитель завтрак отличный безупречный спа прекрасный фитнес общий недостаток кроме отель городской море рядом маленький бассейн |
Make ls from normalized words¶
In [10]:
df_init["ls_normalized_text"] = df_init["normalized_review_text"].apply(lambda x: x.split())
df_init[["ls_normalized_text"]].head(3)
Out[10]:
| ls_normalized_text | |
|---|---|
| 0 | [элегантный, отель, центр, <loc>, красивый, стильный, номер, жуткий, цена, посещение, отель, рекомендоваться, ограбить, банк, неожиданно, разбогатеть, это, писать, набрать, <num>, символ] |
| 1 | [стиль, ваш, поездка, <loc>, это, шопинг, <loc>, молл, созерцание, фонтан, гастрономический, ужин, пожалеть, деньга, усилить, весь, ощущение, номер, вид, фонтан, отель, <org>, это, просто, супер, номер, находиться, нижний, этаж, <loc>, поэтому, вид, фонтан, оттуда, точно, хороший, улица, около, хороший, крыша, это, замечательный, здание, ресторан, общий, самый, хороший, прямо, будильник, заводить, выходить, смотреть, фонтан, балкон, представление, меняться, течение, вечер, балкон, курить, мочь, радовать, расстаться, привычка, номер, продавать, сайт, отель, перекупщик, тип, <misc>, номер, увидеть, реально, работать, удобный, функциональный, умный, дом, управление, весь, электроника, номер, <misc>, дизайн, просто, привлекательный, интересный, очень, функциональный, сервис, честные, <num>, <misc>, мальчик, этаж, любой, вопрос, решаться, моментально, ...] |
| 2 | [провести, супруг, уик, енд, <loc>, самый, люкс, вид, фонтан, весь, уровень, отличный, панорамный, вид, фонтан, номер, шикарный, просторный, стильный, весь, чувствоваться, качество, люкс, номер, бесплатно, предоставить, бентли, водитель, завтрак, отличный, безупречный, спа, прекрасный, фитнес, общий, недостаток, кроме, отель, городской, море, рядом, маленький, бассейн] |
Using BOW with gensim¶
In [11]:
import gensim
from gensim import corpora, models
In [12]:
type(df_init["ls_normalized_text"].values)
Out[12]:
numpy.ndarray
In [13]:
dictionary = gensim.corpora.Dictionary(df_init["ls_normalized_text"].values) # составляем словарь из терминов
print("Размер словаря до фильтрации: {}".format(len(dictionary)))
Размер словаря до фильтрации: 18650
In [14]:
dictionary.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6) # практически не фильтрует
dictionary.compactify() # reassign id
print("Размер словаря после фильтрации: {}".format(len(dictionary)))
Размер словаря после фильтрации: 6975
In [15]:
print(dictionary)
Dictionary<6975 unique tokens: ['банк', 'жуткий', 'красивый', 'набрать', 'неожиданно']...>
In [16]:
corpus = [dictionary.doc2bow(text) for text in df_init["ls_normalized_text"]]
type(corpus), corpus[1:3]
Out[16]:
(list, [[(12, 3), (13, 1), (14, 2), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 2), (24, 1), (25, 1), (26, 1), (27, 1), (28, 2), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1), (44, 3), (45, 1), (46, 1), (47, 1), (48, 2), (49, 1), (50, 1), (51, 1), (52, 2), (53, 1), (54, 1), (55, 1), (56, 1), (57, 1), (58, 1), (59, 1), (60, 1), (61, 1), (62, 1), (63, 1), (64, 1), (65, 1), (66, 1), (67, 1), (68, 1), (69, 1), (70, 1), (71, 1), (72, 1), (73, 1), (74, 2), (75, 2), (76, 1), (77, 1), (78, 1), (79, 1), (80, 1), (81, 1), (82, 1), (83, 1), (84, 2), (85, 1), (86, 1), (87, 1), (88, 1), (89, 1), (90, 1), (91, 1), (92, 1), (93, 1), (94, 1), (95, 1), (96, 1), (97, 1), (98, 1), (99, 1), (100, 1), (101, 1), (102, 1), (103, 1), (104, 1), (105, 1), (106, 4), (107, 2), (108, 3), (109, 1), (110, 2), (111, 1), (112, 2)], [(8, 1), (23, 2), (52, 1), (67, 1), (83, 1), (106, 2), (113, 1), (114, 1), (115, 1), (116, 1), (117, 1), (118, 1), (119, 1), (120, 1), (121, 2), (122, 1), (123, 1), (124, 1), (125, 2), (126, 1), (127, 1), (128, 1), (129, 1), (130, 1), (131, 1), (132, 1), (133, 1), (134, 1), (135, 1), (136, 1), (137, 1)]])
Bi-Gram BOW with gensim¶
In [ ]:
texts = df_init["ls_normalized_text"]
# 1. Создаем биграммы
bigram = models.Phrases(texts, min_count=3, threshold=5) # Обучает биграммы
bigram_phraser = models.phrases.Phraser(bigram) # Применяет биграммы к предложению
# 2. Применяем биграммы к текстам
bigram_texts = [bigram_phraser[sent] for sent in texts]
# 3. Создаем триграммы на основе биграммного текста
trigram = models.Phrases(bigram_texts, min_count=2, threshold=5)
trigram_phraser = models.phrases.Phraser(trigram)
# 4. Применяем триграммы
trigram_texts = [trigram_phraser[sent] for sent in bigram_texts]
bigram_dict = corpora.Dictionary(bigram_texts) # составляем словарь из терминов с учетом биграмм слов предлжений
print("Размер словаря до фильтрации: {}".format(len(bigram_dict)))
trigram_dict = corpora.Dictionary(trigram_texts) # составляем словарь из терминов с учетом биграмм слов предлжений
print("Размер словаря до фильтрации: {}".format(len(trigram_dict)))
Размер словаря до фильтрации: 22921 Размер словаря до фильтрации: 26774
In [18]:
bigram_texts[:3]
Out[18]:
[['элегантный', 'отель', 'центр', '<loc>', 'красивый_стильный', 'номер', 'жуткий', 'цена', 'посещение', 'отель', 'рекомендоваться', 'ограбить', 'банк', 'неожиданно', 'разбогатеть', 'это', 'писать', 'набрать', '<num>_символ'], ['стиль', 'ваш', 'поездка', '<loc>', 'это', 'шопинг', '<loc>_молл', 'созерцание', 'фонтан', 'гастрономический', 'ужин', 'пожалеть', 'деньга', 'усилить', 'весь', 'ощущение', 'номер', 'вид', 'фонтан', 'отель', '<org>', 'это', 'просто_супер', 'номер', 'находиться', 'нижний_этаж', '<loc>', 'поэтому', 'вид', 'фонтан', 'оттуда', 'точно', 'хороший', 'улица', 'около', 'хороший', 'крыша', 'это', 'замечательный', 'здание', 'ресторан', 'общий', 'самый_хороший', 'прямо', 'будильник', 'заводить', 'выходить', 'смотреть', 'фонтан', 'балкон', 'представление', 'меняться', 'течение', 'вечер', 'балкон', 'курить', 'мочь_радовать', 'расстаться', 'привычка', 'номер', 'продавать', 'сайт', 'отель', 'перекупщик', 'тип', '<misc>', 'номер', 'увидеть', 'реально', 'работать', 'удобный_функциональный', 'умный_дом', 'управление', 'весь', 'электроника', 'номер', '<misc>', 'дизайн', 'просто', 'привлекательный', 'интересный', 'очень', 'функциональный', 'сервис', 'честные', '<num>', '<misc>', 'мальчик', 'этаж', 'любой_вопрос', 'решаться', 'моментально', 'весь', 'очень', 'быстро', 'ненавязчиво', 'шопинг', '<loc>_молл', 'идти', 'галерея', 'ребята', 'сотрудник', 'отель', 'помочь', 'понести', 'сумка', 'отель', 'отнести', 'бояться', 'доверять', 'ценный', 'груз', 'смотровой_площадка', 'билет', 'продаваться', 'очередь', 'прямо', 'отель', 'попасть', '<num>', 'пройти', 'галерея', 'туда_обратно', 'контроль', 'безопасность', 'находиться', 'сторона', '<loc>_молл', '<loc>', 'найти', 'придраться', 'весь', 'вкусно', 'сервис', 'прекрасный', 'общий_вывод', 'оказаться', '<loc>', 'транзит', 'вариант', 'снова', 'сюда'], ['провести', 'супруг', 'уик', 'енд', '<loc>', 'самый', 'люкс', 'вид', 'фонтан', 'весь', 'уровень', 'отличный', 'панорамный_вид', 'фонтан', 'номер', 'шикарный', 'просторный', 'стильный', 'весь', 'чувствоваться', 'качество', 'люкс', 'номер', 'бесплатно_предоставить', 'бентли', 'водитель', 'завтрак', 'отличный', 'безупречный', 'спа', 'прекрасный', 'фитнес', 'общий', 'недостаток', 'кроме', 'отель', 'городской', 'море', 'рядом', 'маленький', 'бассейн']]
In [19]:
trigram_texts[:3]
Out[19]:
[['элегантный', 'отель', 'центр_<loc>', 'красивый_стильный', 'номер', 'жуткий', 'цена', 'посещение', 'отель', 'рекомендоваться', 'ограбить', 'банк', 'неожиданно', 'разбогатеть', 'это', 'писать', 'набрать', '<num>_символ'], ['стиль', 'ваш', 'поездка', '<loc>', 'это', 'шопинг', '<loc>_молл', 'созерцание', 'фонтан', 'гастрономический', 'ужин', 'пожалеть', 'деньга', 'усилить', 'весь', 'ощущение', 'номер', 'вид_фонтан', 'отель', '<org>', 'это', 'просто_супер', 'номер', 'находиться', 'нижний_этаж', '<loc>', 'поэтому', 'вид_фонтан', 'оттуда', 'точно', 'хороший', 'улица', 'около', 'хороший', 'крыша', 'это', 'замечательный', 'здание', 'ресторан', 'общий', 'самый_хороший', 'прямо', 'будильник', 'заводить', 'выходить', 'смотреть', 'фонтан', 'балкон', 'представление', 'меняться', 'течение', 'вечер', 'балкон_курить', 'мочь_радовать', 'расстаться', 'привычка', 'номер', 'продавать', 'сайт_отель', 'перекупщик', 'тип', '<misc>', 'номер', 'увидеть', 'реально', 'работать', 'удобный_функциональный', 'умный_дом', 'управление', 'весь', 'электроника', 'номер', '<misc>', 'дизайн', 'просто', 'привлекательный', 'интересный', 'очень', 'функциональный', 'сервис', 'честные', '<num>', '<misc>', 'мальчик', 'этаж', 'любой_вопрос', 'решаться', 'моментально', 'весь', 'очень_быстро', 'ненавязчиво', 'шопинг', '<loc>_молл', 'идти', 'галерея', 'ребята', 'сотрудник_отель', 'помочь', 'понести', 'сумка', 'отель', 'отнести', 'бояться', 'доверять', 'ценный', 'груз', 'смотровой_площадка', 'билет', 'продаваться', 'очередь', 'прямо', 'отель', 'попасть', '<num>', 'пройти', 'галерея', 'туда_обратно', 'контроль', 'безопасность', 'находиться', 'сторона', '<loc>_молл', '<loc>', 'найти', 'придраться', 'весь_вкусно', 'сервис', 'прекрасный', 'общий_вывод', 'оказаться', '<loc>', 'транзит', 'вариант', 'снова', 'сюда'], ['провести', 'супруг', 'уик', 'енд', '<loc>', 'самый', 'люкс', 'вид_фонтан', 'весь', 'уровень', 'отличный', 'панорамный_вид', 'фонтан', 'номер', 'шикарный', 'просторный', 'стильный', 'весь', 'чувствоваться', 'качество', 'люкс', 'номер', 'бесплатно_предоставить', 'бентли', 'водитель', 'завтрак', 'отличный', 'безупречный', 'спа', 'прекрасный', 'фитнес', 'общий', 'недостаток', 'кроме', 'отель', 'городской', 'море', 'рядом', 'маленький', 'бассейн']]
In [20]:
bigram_dict.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6)
print("Размер словаря после фильтрации: {}".format(len(bigram_dict)))
trigram_dict.filter_extremes(no_below=3, no_above=0.4, keep_n=3 * 10**6)
print("Размер словаря после фильтрации: {}".format(len(trigram_dict)))
Размер словаря после фильтрации: 10908 Размер словаря после фильтрации: 14181
In [21]:
corpus_bi = [
bigram_dict.doc2bow(text) for text in bigram_texts
] # составляем корпус документов по словарю полученному с использованием биграмм
corpus_tri = [
trigram_dict.doc2bow(text) for text in trigram_texts
] # составляем корпус документов по словарю полученному с использованием биграмм
In [22]:
print(dictionary)
print(bigram_dict)
print(trigram_dict)
Dictionary<6975 unique tokens: ['банк', 'жуткий', 'красивый', 'набрать', 'неожиданно']...> Dictionary<10908 unique tokens: ['<num>_символ', 'банк', 'жуткий', 'красивый_стильный', 'набрать']...> Dictionary<14181 unique tokens: ['<num>_символ', 'банк', 'жуткий', 'красивый_стильный', 'набрать']...>
Топики на основании модели Latent Dirichlet allocation (LDA)¶
In [23]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm
coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None
topic_range = range(2, 8, 1)
for num_topics in tqdm(topic_range):
model = LdaModel(
corpus=corpus,
num_topics=num_topics,
id2word=dictionary,
passes=5, # More passes improve topic coherence
random_state=42,
) # Train LDA model
coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence="c_v")
coherence_values.append(coherencemodel.get_coherence())
if coherence_values[-1] > best_coherence:
best_coherence = coherence_values[-1]
best_model = model
best_number_of_topics = num_topics
# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()
print(f"Best number of topics: {best_number_of_topics}")
100%|██████████| 6/6 [02:04<00:00, 20.78s/it]
Best number of topics: 4
In [29]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm
coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None
topic_range = range(2, 8, 1)
for num_topics in tqdm(topic_range):
model = LdaModel(
corpus=corpus_bi,
num_topics=num_topics,
id2word=bigram_dict,
passes=5, # More passes improve topic coherence
random_state=42,
) # Train LDA model
coherencemodel = CoherenceModel(model=model, texts=bigram_texts, dictionary=bigram_dict, coherence="c_v")
coherence_values.append(coherencemodel.get_coherence())
if coherence_values[-1] > best_coherence:
best_coherence = coherence_values[-1]
best_model = model
best_number_of_topics = num_topics
# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()
print(f"Best number of topics for bigram: {best_number_of_topics}")
100%|██████████| 6/6 [02:04<00:00, 20.76s/it]
Best number of topics for bigram: 6
In [30]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm
coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None
topic_range = range(2, 8, 1)
for num_topics in tqdm(topic_range):
model = LdaModel(
corpus=corpus_tri,
num_topics=num_topics,
id2word=trigram_dict,
passes=5, # More passes improve topic coherence
random_state=42,
) # Train LDA model
coherencemodel = CoherenceModel(model=model, texts=trigram_texts, dictionary=trigram_dict, coherence="c_v")
coherence_values.append(coherencemodel.get_coherence())
if coherence_values[-1] > best_coherence:
best_coherence = coherence_values[-1]
best_model = model
best_number_of_topics = num_topics
# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()
print(f"Best number of topics for trigram: {best_number_of_topics}")
100%|██████████| 6/6 [02:02<00:00, 20.44s/it]
Best number of topics for trigram: 7
In [31]:
import numpy as np
from gensim.models import LdaModel, CoherenceModel
from tqdm import tqdm
coherence_values = []
best_model = None
best_coherence = -np.inf
best_number_of_topics = None
topic_range = range(8, 14, 1)
for num_topics in tqdm(topic_range):
model = LdaModel(
corpus=corpus_tri,
num_topics=num_topics,
id2word=trigram_dict,
passes=5, # More passes improve topic coherence
random_state=42,
) # Train LDA model
coherencemodel = CoherenceModel(model=model, texts=trigram_texts, dictionary=trigram_dict, coherence="c_v")
coherence_values.append(coherencemodel.get_coherence())
if coherence_values[-1] > best_coherence:
best_coherence = coherence_values[-1]
best_model = model
best_number_of_topics = num_topics
# Plot the coherence scores
plt.figure(figsize=(8, 5))
plt.plot(topic_range, coherence_values, marker="o", label="c")
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend()
plt.show()
print(f"Best number of topics for trigram: {best_number_of_topics}")
100%|██████████| 6/6 [01:59<00:00, 20.00s/it]
Best number of topics for trigram: 12
количество топиков возьмем 7
In [ ]:
number_topics_un = 4
number_topics_bi = 6
number_topics_tri = 12
ldamodel_un = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=number_topics_un, passes=5)
ldamodel_bi = models.ldamodel.LdaModel(corpus_bi, id2word=bigram_dict, num_topics=number_topics_bi, passes=5)
ldamodel_tri = models.ldamodel.LdaModel(corpus_tri, id2word=trigram_dict, num_topics=number_topics_tri, passes=5)
In [33]:
## получение топиков
topics_gensim_un = ldamodel_un.show_topics(num_topics=number_topics_un, num_words=100, formatted=False)
topics_gensim_bi = ldamodel_bi.show_topics(num_topics=number_topics_bi, num_words=100, formatted=False)
topics_gensim_tri = ldamodel_tri.show_topics(num_topics=number_topics_tri, num_words=100, formatted=False)
topics_un = pd.DataFrame(topics_gensim_un)
topics_un.columns = ["topic num", "topic_word"]
topics_bi = pd.DataFrame(topics_gensim_bi)
topics_bi.columns = ["topic num", "topic_word"]
topics_tri = pd.DataFrame(topics_gensim_tri)
topics_tri.columns = ["topic num", "topic_word"]
Vizualization¶
In [34]:
vis_un = gensimvis.prepare(ldamodel_un, corpus, dictionary)
vis_bi = gensimvis.prepare(ldamodel_bi, corpus_bi, bigram_dict)
vis_tri = gensimvis.prepare(ldamodel_tri, corpus_tri, trigram_dict)
pyLDAvis.enable_notebook()
In [35]:
vis_un
Out[35]:
In [36]:
vis_bi
Out[36]:
In [37]:
vis_tri
Out[37]:
In [ ]:
topics_gensim_base_np = topics_base.values
topics_gensim_bi_np = topics_bi.values
In [43]:
topic_gensim_bi.head()
Out[43]:
| topic | word_in topic | weght_topic | |
|---|---|---|---|
| 0 | 0 | очень | 0.020411 |
| 1 | 0 | завтрак | 0.014272 |
| 2 | 0 | хороший | 0.011491 |
| 3 | 0 | гостиница | 0.011312 |
| 4 | 0 | <num> | 0.007953 |
In [42]:
for i in range(4):
plotWordCloud(topic_number=i, topics=topics_gensim_un, head="Топики uni ")
In [43]:
for i in range(6):
plotWordCloud(topic_number=i, topics=topics_gensim_bi, head="Топики bi ")
In [45]:
for i in range(12):
plotWordCloud(topic_number=i, topics=topics_gensim_tri, head="Топики tri ")
Назначим каждому документу наиболее подходящий (наиболее вероятный) для него топик, для каждой из моделей(base и bi).¶
In [47]:
df_init["lda_un"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_un)
df_init["topic_un"] = df_init["lda_un"].str[0]
df_init["probability_un"] = df_init["lda_un"].str[1]
df_init["lda_bi"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_bi)
df_init["topic_bi"] = df_init["lda_bi"].str[0]
df_init["probability_bi"] = df_init["lda_bi"].str[1]
df_init["lda_tri"] = df_init["ls_normalized_text"].apply(get_topic, lda=ldamodel_tri)
df_init["topic_tri"] = df_init["lda_tri"].str[0]
df_init["probability_tri"] = df_init["lda_tri"].str[1]
Look at the evident samples of the classes¶
In [48]:
for i in range(0, 4):
print(f"===================={i}=======================")
filtered_df = df_init[(df_init["probability_un"] > 0.9) & (df_init["topic_un"] == f"{i}")]
display(filtered_df[["topic_un", "review_text", "probability_un"]].head(5))
====================0=======================
| topic_un | review_text | probability_un | |
|---|---|---|---|
| 9 | 0 | В отеле hawthorn suites JBR были с 1 по 6.02.17. Отель не соответствует уровню 4*. Сервис не очень хороший, уборка номеров - плохо! Мы были с семьёй - 4 взрослых. При заезде в номер было только 1 полотенце! Не отдельно для лица, рук, банное. А вообще одно! На второй день попросили поставить все на 4 человека, так и не дождались. В номер принесли только дополнительные халаты и так и не убрались. И только на 4 день проживания доставили все необходимое. Когда я попросила Мейл генерального менеджера. | 0.977289 |
| 16 | 0 | Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! | 0.968671 |
| 18 | 0 | дважды были в этом отеле и если выберем дубаи, то скорее всего сюда жехотя 2-ой раз понравилось меньше, очень много стало русских и персонала и гостей, а это к сожалению для нас скорее минусотличное отношение к детям, много места и на пляже и у бассейнов, гулять с коляской и играть, первый отель инфраструктуры которого достаточно, и не хочется выезжать | 0.973772 |
| 35 | 0 | Могу отнести себя к постоянным клиентам этого отеля. Первый раз приехали в него с женой семь лет назад. С тех пор постоянно остонавливаюсь здесь. Всегда клубный уровень. В прошлом году построили и открыли новое крыло отеля и реконструировали пляж и бассейны. Раньше было мало соотечественников, сейчас начали работать с российскими турфирмами и это преимущество спокойного отдыха к сожалению пропало. | 0.941767 |
| 70 | 0 | Первый раз в Дубай - и первый отель - Zabeel Saray. Если честно, наверное совершили небольшую ошибку установив такую планку), поскольку следующие отели уже в чем-то не вписывались в наши требования.Собственно отель произвел потрясающее впечатление...... Номера, рестораны, пляж, бассейны. Новогоднее представление и новогодний ужин были выше всяких похвал. На сегодняшний момент, это однозначно тот отель в который хочется ехать в Дубай независимо от времени года.Единственный минус - конечно это его цена......... Но за удовольствие необходимо платить. | 0.928347 |
====================1=======================
| topic_un | review_text | probability_un | |
|---|---|---|---|
| 350 | 1 | Отдыхали вдвоем с супругой в этом отеле 5 дней в середине марта.Отель отличный. Отель многоэтажный (больше 10 точно, в лифте не запомнил сколько кнопок) в новом районе Марина, стеклянный, в современном стиле. Очень уютный и современный. Есть бассейн, столовая, магазинчики, какойто салон и по моему спорт зал.В номере есть все необходимое. Мы брали двух местный. Холодильник, бесшумный кондиционер, двуспальная кровать, очень удобный матрац, стол, зеркало, столик диван, шкаф и для чемодана подставка, кухня с полноценными шкафами и посудой, стиральная машина с функцией сушки, телевизор с русскоязычными каналами, чайник и сейф - большой. Ну и конечное же сан узел со всем необходимым и ванной, также был фен. Розетки не евро но воткунуться было куда - в фен и у тумбочки для светильника был разьем под нушу вилку. Ежедневно давали 2 бутылки воды, чай, кофе и сахар.В номере ежедневно убирались, меняли несколько раз белье, каждый день свежие полотенца. Также выдавали полотенца для пляжа.До залива идти минут 10 - 15. Завтрак не брали. Ужинали в отеле - готовят отменно! Окрошка особенно порадовала!Еще внизу можно приобрести экскурсию. Рядом много кафешек, торговый цент минут 10 пешком и метро тоже минут 10. Будем рекомендовать этот отель всем знакомым, а если еще поедем в Дубай, то только в этот отель. Персонал приветливый, всегда улыбаются и здороваются, открывают двери.Если отзыв полезен оцените. | 0.906503 |
| 381 | 1 | Гостиница расположена достаточно удачно с точки зрения ознакомления с городом: рядом станция метро (ближайшая -- Burjuman, выходить на exit 2) откуда можно относительно быстро добраться почти хоть куда. До Дубай-молла и Бурж-Халифа ехать 10 минут за 2,3 дирхама, до Марины 25-30 минут и 4,1 дирхама. Через дорогу от гостиницы у торгового центра Burjuman находится останока Big Bus Tour.Сама гостиница чистая и опрятная, номера просторные. Есть бесплатный wi-fi. Завтраки разнообразные и вкусные.Ресторан Kris Kin на 19 этаже просто отличный и вид из него отменный, Le Metro на первом этаже работает круглосуточно, что очень удобно.Очень выручал бар на первом этаже, где можно было выпить пива и перекусить. | 0.954704 |
| 428 | 1 | Чудесный отель( останавливаемся 3 раз). Находиться далеко от Jumeirah , но с детьми близко ехать до парка раздвоений, Lego Land парка и др, различений. Удобно ехать до Абу даби. Тихий отдых на природе (.територия большая и зелёная ) . Персонал внимательный. | 0.946814 |
| 458 | 1 | Находится прямо около метро. Приятно удивиди велком дринком каждый раз. Персонал очень отзывчивый и старается во всем помогать. Линия метро удобная тем, что ветка и можно поехать по двум линиям. Номера нормальные, чистые. Каждый день дают бутылку воды | 0.963529 |
| 483 | 1 | Если вы едете в Дубаи, чтобы много посмотреть и в отеле только ночевать, то отель сойдет. Из плюсов есть бассейн на крыше, сносный завтрак. Номера небольшие, все соответствует трехзвездочному отелю. До метро идти минут 10-15, есть автобус на бесплатный пляж. | 0.944900 |
====================2=======================
| topic_un | review_text | probability_un | |
|---|---|---|---|
| 2 | 2 | Провели с супругой там уик енд. Брали самый люкс с видом на фонтаны. Все было на уровне. Отличный панорамный вид на фонтаны. Номера шикарные просторные стильные. Во всем чувствуется качество и люкс. К номеру бесплатно предоставили бентли с водителем. Завтраки отличные , безупречное спа, прекрасный фитнес, во общем недостатков нет, кроме того что отель городской и моря рядом нет. Ну и маленький бассейн. | 0.978078 |
| 10 | 2 | Номера очень просторные и красивый вид из окна.Большой плюс - это наличие Интернета в комнате.Хорошо провели время в этом отеле! | 0.933540 |
| 32 | 2 | Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным | 0.950930 |
| 33 | 2 | Комфортное место для отдыха с семьей. Хороший пляж. Немного шумно от стройки рядом, но это временно. Рядом расположен отличный ночной клуб. Хорошие рестораны, очень комфортный СПА. Но, нет русскоговорящего персонала, что является большой проблемой для наших соотечественников . | 0.909419 |
| 54 | 2 | Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу | 0.921892 |
====================3=======================
| topic_un | review_text | probability_un | |
|---|---|---|---|
| 24 | 3 | В отеле НЕТ ГОРЯЧЕЙ ВОДЫ. Только холодная и очень холодная. Когда просишь вызвать такси-тебе подсовывают каких-то нелегальных извозчиков с завышенными в 3 раза ценами. Неплохой ресторан. Хороший вид из окна (если повезет). Вокруг отеля стройка со всех сторон. | 0.945150 |
| 558 | 3 | Отель никак не соответствует 4-м заявленным звездам, это твердая двойка. Он терпимый, но нельзя писать, что это 4*Плохое расположение. Сервис ок. Еда более менее, но совершенно опять же не 4*Чистота номеров - не супер, но убирали каждый день. | 0.964991 |
| 656 | 3 | Есть номера для курящих (в них запах дыма не выветривается) и номера для некурящих.На второй день договорились, и нам бесплатно поменяли номер.Завтраки понравились. Обслуживание понравилось.Полностью соответствует своему классу и стоимости. | 0.956712 |
| 683 | 3 | Все в целом хорошо, персонал приветливый, но есть и но:1. интернет в номере почти не ловит, а если ловит не работает2. вода в душе чуть теплая3. плохо уходит в ванной, попросили отремонтировать...посмотрим | 0.952981 |
| 857 | 3 | Убираются плохо.Только меняли постельное белье и полотенца. Полотенца очень старые. Полы ни разу не пропылесосили и не помыли за 2 недели. Пыль не вытирали. Кухня очень хорошо оборудована бытовой техникой. Есть тостер, микроволновая печь, электрическая плита, кофеварка, электрический чайник и холодильник. также посуда и кастрюли. Можно готовить все необходимое. Очень плохое освещение в комнатах. И очень слышно шум от соседей. Особенно звук двигающихся стульев. Надо что-то им придумать на этот счет. Если хотите жить на Монмартре, то можно поселиться здесь. Но если Монмартр не принципиален, то можно найти что-то получше. | 0.983652 |
In [49]:
for i in range(0, 6):
print(f"===================={i}=======================")
filtered_df = df_init[(df_init["probability_bi"] > 0.9) & (df_init["topic_bi"] == f"{i}")]
display(filtered_df[["topic_bi", "review_text", "probability_bi"]].head(5))
====================0=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 16 | 0 | Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! | 0.967661 |
| 141 | 0 | Отдыхала с 13 сентября, неделю. Все очень понравилось! Всем рекомендую! Не верьте плохим отзывам! Встретили хорошо, дали номер на ступень выше! Кормили в ресторане оч вкусно и изыскано! Пляж и море великолепны! Нет никаких запахов! Отдельно спасибо персоналу и девочкам на ресепшене, все приветливые и добрые! Всем удачи! | 0.974420 |
| 410 | 0 | В июле отдых в отеле Le Royal Meridien Beach Resort & Spa удался. Летели из Донецка Air Arabia - комфортно 4 часа. В Шардже встретили цветами.Отвезли в отель к 11 вечера как раз к ужину. От обслуживания только приятные впечатления. У отеля есть душа. Она в улыбках и предупредительности каждого работника, которого я встречала. Не смотря на низкий сезон отель полон туристов. Территория отеля великолепная. Океан, конечно же, 37 градусов , но мне понравилось.Три бассейна на территории отеля , носят охлаждённые полотенечки и воду. Завтраки и обеды безукоризненны , великое множество морепродуктов,элитных сыров, фреши, в общем европейская кухня, здесь и воду подают в стекле. Холл отеля наполнен особой атмосферой. Живые цветы , мерцание свечей и прекрасное пение (в ресторане живая музыка) делают романтичным каждый вечер. Я осталась очень довольна. Думаю стоит вернутся сюда и не раз. | 0.932169 |
| 432 | 0 | Приезжали во второй раз, все впечатления только позитивные. Это тот отель, в который хочется вернуться еще раз. Отдыхали в августе, были удивлены водорослями и обмелевшим морем, может это временные неудобства... | 0.953022 |
| 600 | 0 | Отдых провели просто чудесно Отдыхали 28 дней Приедим ещо если приобретут коляски на воду чтобы люди с ограниченными возможностями могли наслаждаться морем Будем рады если об этом будут помнить Большое всем спасибо | 0.955753 |
====================1=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 32 | 1 | Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным | 0.947385 |
| 39 | 1 | Трижды были здесь. Каждый раз качество пребывания было на высоком уровне! Лаунж очень сильный и удобный. Пляж уютный, есть возможность загорать на травке. Находится на волке, так что можно развлечь себя вечером прогулкой по нему и заходом в одно из кафе. Также имеются хорошие магазины по близости. Всем советую! | 0.968668 |
| 54 | 1 | Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу | 0.930089 |
| 84 | 1 | Останавливаемся в отеле не в первыйи, надеюсь, не в последний раз. Удачное расположение, прекрасное обслуживание, вежливый и доброжелательный персонал, всегда готовый помочь в решении вопросов. Чистота в номере. | 0.947030 |
| 100 | 1 | Расположен очень красиво, пляж и номера красивые. Обслуживание отличное. Самое главное есть с кем на русском поговорить... И район очень удачный. Очень доволен этим отелем. Рядом каждые выходные бесплатный авто мото шоу ;) | 0.961838 |
====================2=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 683 | 2 | Все в целом хорошо, персонал приветливый, но есть и но:1. интернет в номере почти не ловит, а если ловит не работает2. вода в душе чуть теплая3. плохо уходит в ванной, попросили отремонтировать...посмотрим | 0.957948 |
| 770 | 2 | Плюс - расположение, недалеко от Opera, Galeries Lafayette, в 5 минутах ходьбы от метро и многочисленных баров.НО - состояние отеля удручающее! Низкие потолки, дешевое мыло в ванной комнате, узкие коридоры, ступени просто разваливаются. А персонал просто оставляет желать лучшего: неприветлив, холоден, а порой и просто раздражителен. Завтрак скуден, столовая маленькая, все столы почти всегда заняты и нет чистой посуды.Не реокмендую!!!! | 0.978412 |
| 836 | 2 | Плюс: Местоположение - 5 минут пешком до Нотр-Дамма.Минусы: Очень тесно во всем отеле. Маленький ресепшн. Маленькие коридоры. Маленький лифт. Маленькие комнаты. Маленькое все. Номера подходят разве что для режима "только переночевать". Но и с этим могут быть проблемы - мизерные подушки, не совсем подходящие для сна. Парковка есть, но не собственная. Расположена в соседнем квартале. Чемоданы придется нести самостоятельно. | 0.973697 |
| 1897 | 2 | Еще один отель, который удалось посетить в Париже. Чем понравился:1) Вежливый и доброжелательный персонал.2) Чистые и опрятные номера.3) Одно из самых важных на мой взгляд - бесплатный Wi-Fi.4) Хорошие широкие кровати. | 0.947174 |
| 2139 | 2 | Удобно расположен для пеших прогулок и не далеко от станции метро/электропоездов (RER). Уютный и чистый. Доброжелательный персонал. Маленькие минусы: на завтрак- горячие только чай-кофе-молоко...))) В номерах (мы снимали два номера) "очень хорошо" помыли чайники- первое время в них присутствовал запах уксуса.... Но мы прожили неделю и в целом остались очччень довольны!!! | 0.915946 |
====================3=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 204 | 3 | Отель находится рядом с аэропортом 15 минут на такси. Русских селят на этаж между лобби и первым, окна на козырек, запах из вытяжки кухни, видели маленького тараканчика. В номере холодно. Из плюсов: близко метро, завтраки. | 0.963335 |
| 277 | 3 | Сам по себе отель хороший, расположен в верхней зоне аэропорта. Он как бы возвышается над круглосуточной суетой торговой пешеходной зоны терминала аэропорта. С точки зрения комфорта все замечательно- чистое нежное белье просторные мягкие кровати, хороший санузел. Но - больше 200 долларов менее чем за сутки (а более суток там кажется вообще никто не останавливается) это конечно существенный барьер на пути стыкующихся в Дубае. Кроме того персонал отеля без спроса списывает со счета карты оплату в валюте кредитной карты - т.е. с двойной конвертацией - сначала из рублей (долларов, евро) в AED а потом обратно в рубли. Будьте внимательны - требуйте списания в валюте отеля иначе + 7% к стоимости проживания вам гарантировано прибавится! Что приятно поразило - доставка еды в номер оказалась по стоимости ниже чем стоит поесть в ресторане терминала аэропорта. | 0.988764 |
| 328 | 3 | Останавливались в этом отеле на Новый Год 2014.Не хотел отель, расположенный в Дейре из-за специфичной публики и обстановки, но и Дубай Марина дороговато, поэтому поселились где-то посередине.Вокруг строящийся район, однако, довольно мирный и тихий.До метро идти 10 минут, до Mall of the Emirates - около 15 минут. Этот молл, кстати, понравился больше всего в Дубае, не такой необъятный и суетливый как Dubai Mall.На метро можно быстро доехать и до Даунтауна и до Марины. Но до Марины советую всё же взять такси: будет стоить около 20 дирхамов.Номера стандартные, практически такие же, как в России, возможно только санузел поменьше. Завтраки более-менее неплохие, но очень однообразные, за неделю сильно надоели. | 0.984714 |
| 459 | 3 | Отель входит в часть выставочных зданий World Trade Centre, где постоянно проходят какие то выставки и распродажи. Для тех кто приехал на выставку один из лучших вариантов размещения. До выставочного зала от номера 5 минут пешком.Рядом (8 минут пешком) станция метро.Есть ресторан при отеле и рядом еще несколько, но показатель цены/качество не хороший, сказывается близость выставочного комплекса.До пляжа 15 минут на такси. Трансфера на пляж нет.Сильно удивило, что халаты есть, а тапок нет, но так и написано, так что это не минус а особенность.Номер небольшой, 25кв/м. что опять же говорит о бизнес направленности отеля.Хороший персонал.В номере убирались ежедневно, с замной полотенец и косметики. | 0.911796 |
| 557 | 3 | Все хорошо...не отлично конечно но хорошо...грех жаловаться есть все. Интернет вай фай бесплатный. Парковка бесплатная подземная. Завтрак шведский стол все говорят что в Турции лучше но нам и так норм было. Так что все хорошо... | 0.939872 |
====================4=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 38 | 4 | Пляж у отеля свой, огороженный, но напротив в 200 метрах идет грандиозное строительство (идет отсыпка), грузовики, экскаваторы, огромные баржи с камнями - вода не совсем чистая.Территория красивая, но маленькая. Еще один минус, что комнаты без балкона.. | 0.961761 |
| 446 | 4 | Отелем остался очень доволен. Есть все что можно захотеть. Большая территория и везде комфортная обстановка. Отличный завтрак. Утро после завтрака сидя в горячей жакузи трудно поднять себя и лень выходить из отеля) | 0.950583 |
| 813 | 4 | Шикарное место, шикарная история отеля, номера, как и всегда в Париже не самые просторные, но все необходимое есть. Самое главное, что иногда везет и тебе дают номер, где с балкона можно наблюдать за Опера. Завтраки очень достойные. | 0.950496 |
| 996 | 4 | Отличный отель с богатой историей. Список знаменитостей поражает. Очень хорошо - Лувр виден с балкона. Номера чистые с интересной мебелью. Рядом куча ресторанов. Хорошее расположение, просторный номер, который убирали каждый день, нормальные завтраки, Wi-Fi везде работает. Да унитаз от villeroy&boch. | 0.968769 |
| 1158 | 4 | I stayed at the Citadines Trocadero for the third time. This is a very convenient location close to the center of Paris, but quiet and safe. In walking distance from the Trocadero, Champ de Mars, the Eiffel Tower. Near three metro stations, cafes, restaurants, supermarkets. Very comfortably. 16 arrondisment Paris, very calm. There are no crowds of tourists. Not too many clochard, migrants and beggars. Studio this time went on the 6th floor, small but comfortable. Two large balconies, you can enjoy breakfast outside. Unfortunately the weather did not indulge, almost all the days it rained.Я останавливаюсь в Citadines Trocadero уже в третий раз. Это очень удобное место рядом с центром Парижа, но тихое и безопасное. В шаговой доступности от Трокадеро, Марсова поля Эйфелевой башни. Рядом три станции метро, кафе, рестораны, супермаркеты. Очень удобно. 16 аррондисмент Парижа очень спокоен. Здесь нет толп туристов. Не слишком много клошаров, мигрантов и попрошаек. Студия на этот раз досталась на 6 этаже, небольшая но удобная. Два больших балкона, можно завтракать на улице. К сожалению погода не баловала, почти все дни шли дожди. | 0.931413 |
====================5=======================
| topic_bi | review_text | probability_bi | |
|---|---|---|---|
| 7 | 5 | Хороший отель. Питание отличное. Хотя отель не старый, но требует ремота в ванных компатах. Было сыро, вещи не высыхали. | 0.923633 |
| 672 | 5 | Шикарный отель. Сервис на высшем уровне. Огромная и зеленая территория. По которой можно перемещаться или на багги или на лодочках. Возможность бесплатного посещения аквапарка для постояльцев отеля. Дружественный персонал. Заселили в номер сразу по приезду, а это было около 7-ми утра. | 0.963317 |
| 1029 | 5 | Все было хорошо, хотя цены, если их брать без скидки от а клуба, несколько завышены. | 0.906613 |
| 1797 | 5 | Не соответствует цене и качеству! Номера тянут еле еле на 3 звезды! Нет бедэ в туалетах! Телевизоры до потопные, с пульта еле переключаются! За 300 евро в день могло бы и лучше быть! Все серое и мрачное , ремонт явно нужен! | 0.963548 |
| 2581 | 5 | Украли сумку с обувью. После этого появилась табличка в холле, что администрация не несет ответственности за украденные вещи....В остальном претензий у меня нет. Удобное месторасположение, новый ремонт в номерах. | 0.955794 |
In [52]:
for i in range(0, 12):
print(f"===================={i}=======================")
filtered_df = df_init[(df_init["probability_tri"] > 0.7) & (df_init["topic_tri"] == f"{i}")]
display(filtered_df[["topic_tri", "review_text", "probability_tri"]].head(5))
====================0=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 6682 | 0 | 宮殿橋のあたりまで楽々お散歩できるので、跳ね橋があがるのを(AM1:35)見学してから徒歩で帰っても大丈夫でした。ただし、フロントが3階にありエレベーターが無いので、スーツケースを運ぶのが大変です。プチホテルなのでもちろん団体客の利用も無く、ホテル内はとても静かでした。バスタブ付き希望だったためコンフォートルームを利用したのですが、3人入れるくらいの大きいバスタブだったため、お湯をためるのが大変で結局シャワーのみを利用した日もありました。カップルや新婚さんが一緒に入るぶんにはステキだと思うのですが…。 | 0.770832 |
====================1=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 120 | 1 | Попали в этот отель случайно. Наш самолет задержался по погодным условиям. Нас встретили, заселили с 4-х разовым питанием, а утром проводили в Джакарту. Огромное спасибо отелю Millennium Plaza Hotel Dubai и авиакомпании Emirates! | 0.721260 |
| 431 | 1 | Нас отель привлёк тем, что находится вдали от города. Получили то, что и ожидали, даже немного больше. Великолепный парк на территории отеля, водопады, птицы. Очень чистый и ухоженный пляж, заход в море был очень неплохой и купание не доставляло проблем. Вот только вид на бетонные конструкции немного портит общую картину. | 0.703712 |
| 3340 | 1 | Открыли этот отель для себя 3 года назад. После всех 5* Питера, этот отель всегда оставляет лучшие впечатления. Душевный прием персонала, оригинальные номера (больше всего оценили номера на втором этаже, выходящие на канал: Париж, Санкт-Петербург, Рим). Жаль только, что на завтрак перестали готовить сырники, раньше они там были восхитительны:))) | 0.963326 |
| 6423 | 1 | Приехал в пансионат после большого перерыва, ничего не изменилось кроме цен и чистоты в номере и качества белья. Цены изменились в худшую сторону , особенно раздражает что за каждый отдельный чих приходиться платить, а все остальное в лучшую сторону. Еда отличалась разнообразием но при этом была пресная и безвкусная. | 0.830752 |
====================2=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 281 | 2 | Отличный отель, комфортный, тихий, чистый, с хорошим сервисом. Совсем не ощущаешь себя в аэропорту. Вркруг - приличные рестораны, duty-free. Приветливый персонал, готовый во всём помочь, вплоть до проводов и помощи с багажом до соседнего терминала. | 0.747938 |
| 877 | 2 | Средненький отель, но в плане перемещений удобен, рядом метро, есть кафешки и супермаркеты, стоит не полениться и сходить до канала Сан-Мартен, там своя атмосфера и по-своему красиво. Типичный завтрак, круассан, сок, кофе, багет - всё свежее. Доброжелательный персонал. В номерах нет посуды (кружек, ложек). | 0.963318 |
====================3=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 363 | 3 | От отеля есть трансфер ко второму клубному отелю с лежаками у моря и хорошим бассейном. Питание очень хорошее. На завтраках куча народа с детьми, а вот ужины просто потрясающие разнообразное меню которое Ежедневно меняется | 0.769915 |
====================4=======================
| topic_tri | review_text | probability_tri |
|---|
====================5=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 124 | 5 | В отеле очень стараются сотрудники - очень трудолюбивые и усердные + еда на завтраке приличная ! Рядом выставочный центр, остальное катастрофа - воняет хлоркой, видно делают дезинфекцию по полной программе, сауна и паровая баня на уровне 2*, лифты очень долгие с идиотской системой, кондиционер старый, окна не моют | 0.704235 |
| 125 | 5 | Отель мне кажется не тянет на 4,точно 3 по мировым стандартам.Рядом был 4 звезд-й отель,по сровнению с этим отелем куда больше круче.25 этажное здание и только 2 лифта,а на завтрак каждый день одно и тоже,мало выбора.На некоторых местах кафель отваливался.В общем отель не для ценителей комфотрного отдыха.А отель сам по себе очень хорошо расположен,рядом и метро.Окно нашего номера выходило на здание напротив,и ничего кроме стекла нам не было видно. | 0.745164 |
| 174 | 5 | Мы там остановились на три ночи с 7 по 10 января, с самого первого дня в ужасе были, номера ужасные - мебель побитая, разбитая, в комнате и в ванной грязно было, сервис ужасный, в ресепшене тоже отношение ужасное.... народу много на удивление и все в шоке от такого ужаса, очень шумно в отеле и в номерах, ночью спать невозможно было, шум сверху, с боку... как будто заселились в общежитии. Утром чтоб позавтракать надо было ждать и искать место, так как народу много было, в общем не отдых а катарга!!! | 0.932138 |
| 306 | 5 | Абсолютно простой, ничем не запоминающийся отель. Нет каких либо провалов, но и нет ничего запоминающегося. Пришли, переночевали, ушли... Завтраки обильные, но однообразные. Если номер возле лифтов, то слышно как они довольно громко сигналят с 1 по 14 этаж - фойе открытое. Если у вас бессонница, то может возникнуть проблема. | 0.878165 |
| 743 | 5 | В целом неплохо за исключением неосведомленности туроператора о сервисах отеля. Не возможно спать в четвером на одной кровати. Наличие одного стула на четверых считаю недопустимым. На полу по всему номеру чужие волосы. | 0.828071 |
====================6=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 123 | 6 | Новый бизнес отель идеально расположен для тех кто приехал посетить выставки в районе WTC | 0.792522 |
| 457 | 6 | Просторные, чистые апартаменты. До всех достопримечательностей только на такси, с которым в этом районе небольшие проблемы. В общем, зная цены в Дубае на отели, это вполне достойный вариант цена/качество. | 0.951746 |
| 571 | 6 | Отель находится в районе Марина. Расположен прямо на набережной канала, рядом много ресторанов, кафе и магазинов, невозможно остаться без покупки. До пляжа джумейра совсем недалеко. Хорошие номера и неплохие завтраки. | 0.750969 |
| 696 | 6 | Отличный отель. Новый, хороший дизайн. Отличный персонал. Недалеко от пляжа. Далековато от метро, но несложно пользоваться автобусами для поездок до метро, тем более платить за это отдельно не приходится. Завтраки скудноваты, но вполне сносно. Из близлежащих кафе очень рекомендую Saladisios. Он находится по дороге на пляж между улицами Al Wasl и Jumeirah. В отеле предоставляется один час Wi-Fi бесплатно. Но его можно использовать по частям, поэтому этого было вполне достаточно. | 0.730585 |
| 731 | 6 | Местопасполойение било очень хороший,недалеко от пляжа.Отель наьодится близко от станции метро!Уборка, сервис на пятерку. Очень удобное расположение для прогулок .На крыше есть уютный басейин, маленький, но чистый.Недостатки: платный wifi | 0.822961 |
====================7=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 116 | 7 | Очень даже хороший вариант, если цель вашего визита- прогулки по городу и шоппинг. Из плюсов- метро близко, сами возят на городские пляжи, близко несколько ТЦ, приличное питание, достаточно чисто. Минусы- практически их нет (если вы трезво оцениваете 3 звезды). Может только дурацкий вид из окна... | 0.747563 |
| 215 | 7 | Я счетаю, что этот отель заслуживает еще +1*!!!Когда я жила в этом отеле, производили полный капитальный ремонт! Новая мебель, абсолютно все заменяли на новое!!! Далеко не во всех 4* отелях вы можете увидишь в своем номере фен, сейф, и телевизор плазму... В этом отеле все выше перечисленное уже входит в стоимость за номер! Цена по Дубайским меркам реально доступная! А так же вы можете пользоваться бассейном на крыше, имеется ночной клуб при отеле, и от центра Дубай расположен не так далеко... | 0.740672 |
| 725 | 7 | Всё культурно. На ресепшене относились к нашим пожланием с пониманием. Недорогая цена. Расположение нам подошло (море не так далеко и метро рядом). Удобный бассейн на крыше - можно комфортно располагаться на мягких креслах, от солнца защищают ОГРОМНЫЕ зонты | 0.793458 |
| 802 | 7 | Замечательный в соотношении качество-цена отель. Несмотря на крохотные номера, в нем есть что-то абсолютно французское - из витого железа лифт, винтовая лестница, в номерах репродукции Монэ. Окна выходили на проезжую часть, но прекрасная шумоизоляция и качественные теневые шторы гарантируют Вам спокойный сон в любое время суток. Рядом с отелем великолепная французская булочная всегда со свежей выпечкой, супермаркеты и винный бутик с широким выбором французских вин и коньяков изо всех провинций Франции. В двух минутах станция метро и католический храм, множество кафешек и ресторанов. Автобусная остановка напротив отеля, от которой в центр Парижа Вас доставят два автобуса - № 72, который идет через сам город к галерее La Faette (центр продаж и тоже достопримечательность Парижа из-за своего фантастического убранства). Здесь же множество достопримечательностей - опера, национальный музей и ит.д.). Автобус № 22, который выезжает через несколько остановок на парижскую набережную, где Вы можете любоваться и Эйфелевой башней и площадью Конкорд и Трокадеро и т.д. Завтрак всегда одинаков - Вам подают круасан, буквально половину французского батона, мед, джем, масло. Все остальное Вы выбирате сами - сыр, ветчина, яйца, шоколадная паста, чай, какао, кофе, молоко. Удачного путешествия в сказочный Париж! | 0.715492 |
| 830 | 7 | Что может быть лучше, чем остановиться в 10 минутах неспешной ходьбы от Лувра с одной стороны, и от Нотр-Дам - с другой? Отель на маленькой улочке, очень небольшой, несколько старомодный. И хотя наши окна выходили во двор, тем не менее общее впечатление было превосходное. Аромат времени подчеркивали крутые лестницы, почерневшие дубовые балки перекрытий на потолке комнаты... Нам понравилось. | 0.805318 |
====================8=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 7 | 8 | Хороший отель. Питание отличное. Хотя отель не старый, но требует ремота в ванных компатах. Было сыро, вещи не высыхали. | 0.916576 |
| 9 | 8 | В отеле hawthorn suites JBR были с 1 по 6.02.17. Отель не соответствует уровню 4*. Сервис не очень хороший, уборка номеров - плохо! Мы были с семьёй - 4 взрослых. При заезде в номер было только 1 полотенце! Не отдельно для лица, рук, банное. А вообще одно! На второй день попросили поставить все на 4 человека, так и не дождались. В номер принесли только дополнительные халаты и так и не убрались. И только на 4 день проживания доставили все необходимое. Когда я попросила Мейл генерального менеджера. | 0.853009 |
| 16 | 8 | Хочу сказать что я в полном восторге от этого отеля!И если поеду еще раз в дубай то снова туда!Это сказочный отель и стоит этих денег!Мы провели не забываемые дни как в сказке !Завтраки супер ,чистота номеров 5+,Сервис диствительна толька там такой ! Это отель высокова класса!! Не успели приехать так снова хочется обратно! | 0.777891 |
| 18 | 8 | дважды были в этом отеле и если выберем дубаи, то скорее всего сюда жехотя 2-ой раз понравилось меньше, очень много стало русских и персонала и гостей, а это к сожалению для нас скорее минусотличное отношение к детям, много места и на пляже и у бассейнов, гулять с коляской и играть, первый отель инфраструктуры которого достаточно, и не хочется выезжать | 0.971336 |
| 29 | 8 | Были с 22 февраля по 1 марта 2014.Отдыхал с женой о дочерью 12 лет.Думаю, что отель подходит для активных людей, которые любят отдыхать самостоятельно. Так как, транспортное расположение, лучше не придумаешь. Но, об этом позже.1) Номер был 435, то есть на 4-ом этаже. Так как, в этом отеле популярный, среди местного населения, бар и дискотека, то, этот этаж - самое то. Бум-бум, конечно доноситься, но мы спали нормально, так как усталость, после целого дня гуляния, даёт о себе знать. Если бы жили на 3-ем этаже, то, наверное, было бы гораздо шумнее.Номер - двуспальная кровать, шкафы, телевизор, холодильник. Всё староватое, но чисто, аккуратно. Никакой живности, как говорят в других отзывах, не наблюдали.Сейф бесплатный на ресепции. Фен, утюг и кипяток приносят в номер. Язык общения - английский. Хотя, есть русскоговорящий Азиз, но он работает не каждый день. Все приветливые, проблем не было - они здороваются и я здороваюсь, они улыбаются и я улыбаюсь )) Всё было нормально. Главное - не париться. Хотя, были некоторые наши соотечественники, которые, с сильным возмущением, всё время что-то требовали, причём громко и на русском языке.2) Питание - завтраки. Каждый день одно и тоже. Яичница, сосиски, вода, сок, чай, тосты, фрукты. Но, нам хватало и за неделю, почти не надоело ). Голодными не были. Сосиски попросите у персонала, так как, на общем столе их нет. Местные блюда на завтраке пробуйте с особой осторожностью - очень острые.3) Любителям алкоголя. На 1-ом этаже, возле ресепции, есть бар. Продают и пиво и водку и коктейли. Пиво (Будвайзер), около 250 руб. за кружку. Там же, в баре, находятся жрицы любви, которые будут к вам обращаться. Но, если, вы скажете (на английском, естественно )), что вы хотите побыть один и просто выпить пару пива, теряют к вам интерес. Поэтому, можно просто посидеть, попить немного пивка и посмотреть телик, там спортивный канал. А алкоголь, лучше приобретите в Дьютике по прилёту в Дубай.4) Транспорт. Рядом автобусная станция (Аль Губейба) и станция метро №24, 5 минут пешком от отеля. Если планируете использовать общественный транспорт, то купите в метро серебряную карточку - стоит примерно 200 руб. Она и для поездок на метро и для автобуса.Автобус №8. На нём, вы можете доехать за 2,3 AED (примерно 20 руб.) до пляжа Джумейра Бич за 15 минут. Пляж - вход бесплатный.Также, на этом же автобусе, примерно за 30 минут, можно доехать до Джумейра Парк Бич. Пляж - вход 5 AED (примерно 50 руб.).И также, на этом автобусе, примерно за 45 минут и примерно за 45 руб. с человека (на такси, примерно 500 руб.), можно доехать до аквапарка Вайлд-Вади.5) Музей Дубая. Рекомендую. От отеля 10 минут пешком. Стоит 1 AED.6) Рядом много кафешек. Можно и шаверму поесть за 5 AED (примерно 50 руб.). Если выйти с заднего входа отеля, то сразу через дорогу, будет кафешка Голден Фок, где есть меню на русском языке. Пиво, там, только безалкогольное )7) На метро с одной пересадкой, примерно за 30 руб. и за 40 минут, доберётесь до Бурж-Халиф, если без пробок на такси, примерно 20 минут и 300 руб. Такси берите, только с разноцветными крышами (синие, зелёные, красные, жёлтые), они возят по счётчику. Другие, вас повезут, в тот же Бурж-Халиф, минимум за 500 руб.ИТОГ. Для нашей семьи было всё комфортно. С утра, после завтрака, на автобусе №8 на пляж, там 3 часа, назад на автобусе. В отель, переодеваться и сполоснуться. После 14.00, в Бурж-Халиф или Дубай-Марина гулять, на метро. Часов в 22.00 на такси в отель, так как ноги отваливались. | 0.715854 |
====================9=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 1107 | 9 | В полне приличный бизнес-отель, приятный дизайн в светлых тонах. Окна выходят, в основново внутренний двор-колодец. Из минусов - стандартно тонкие стены и скрипучие полы, если кто то прошелся по комнате - слышно во всех ближайших номерах. | 0.761679 |
| 1414 | 9 | Неплохой отель в 2 минутах от острова Сите. Расположение хорошее, но на мой взгляд, слишком "туристическое" - вокруг одни туристические лавки, арабская кухня и оооочень много людей. К счастью, сам отель находится на малюсенькой спокойной улочке, но стоит сделать 2 шага - и ты попадаешь в поток людей, еды и магазинов. Атмосфера Парижа здесь не ощущается.Что касается номера - у нас быд номер на двоих с огромным портретом Франциска Первого над изголовьем кровати, что периодически ночами внушало страх увидеть приведение:) В целом, я бы сказала, что несмотря на артистический тон номера и попытку совместить историю и современность в интерьере, у отеля не получилось создать в нем главное- уют:) | 0.760764 |
| 3726 | 9 | “Понравилось все! Приветливый, тактичный, высокопрофессиональный персонал. Комфортные номера, отличное месторасположение отеля. Да, и еще нам очень повезло с ценами, в том смысле, что поселили нас в более престижной категории... повезло. Сами будем останавливаться только в "Традиции" и другим советуем. Еще плюс, в двух шагах очень приличное кафе "La menu". ” | 0.711274 |
| 3736 | 9 | Немного маловат, но в целом отель чудесный. Все в порядке, завтраки радуют. Номера убирают хорошо. Бесплатные чай, вода, миишоколадочки. Кроме того, и кофе тоже бесплатное в пакетиках. Вечером очень выручает. В номере немного скрипела кровать и дверь туалета. Была немного грязновата подушка, и ее не меняли долго. | 0.851135 |
| 4942 | 9 | Отличный интерьер в холле, на втором этаже (в столовой) камин и пианино, все очень красиво и атмосферно. Очень понравились разрисованные двери! :)Чисто, тихо, 4 минуты пешком от метро. Можно припарковаться во дворе. Каша на завтрак - это очень классно! :) | 0.708934 |
====================10=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 2 | 10 | Провели с супругой там уик енд. Брали самый люкс с видом на фонтаны. Все было на уровне. Отличный панорамный вид на фонтаны. Номера шикарные просторные стильные. Во всем чувствуется качество и люкс. К номеру бесплатно предоставили бентли с водителем. Завтраки отличные , безупречное спа, прекрасный фитнес, во общем недостатков нет, кроме того что отель городской и моря рядом нет. Ну и маленький бассейн. | 0.863462 |
| 17 | 10 | Потрясающий, восхитительный, роскошный, незабываемый отель! Все на высоте: персонал, сервис, еда!!! Большое количество ресторанов с различными кухнями мира!Прекрасный пляж!!! Большая территория!!!Всем рекомендую! | 0.810104 |
| 32 | 10 | Удобная чистая готиница,прекрасно для тех кто любит спокойный отдых.Хорошо отдыхать с семьейПрекрасный пляж.Много басейнов чистота ,не шумно.Единственное было бы лучше если прием был бы более приветливым и служба консержа более внимательным | 0.835843 |
| 54 | 10 | Все было супер. Если полетим отдыхать в Эмираты, то остановимся только в этом отеле.Персонал очень доброжелательный. Обязательно будем рекомендовать только этот отель.Расположен очень хорошо к пляжу | 0.923604 |
| 64 | 10 | отдыхали семьей в октябре 2013. отель очень понравился.отличный,просторный номер с кухней,где есть все необходимое.Убирали номер каждый день,меняли белье,полотенца. Завтраки разнообразные,все вкусно.очень дружелюбный персонал.Классный бассейн и тренажерный зал.Беспроводной интернет был всегда.В отеле очень тихо и спокойно.Спасибо персоналу за чудесный отдых! | 0.737909 |
====================11=======================
| topic_tri | review_text | probability_tri | |
|---|---|---|---|
| 433 | 11 | Прекрасный отдых для любого возраста. Очень понравился отель детям, они смогли заниматься теннисом с прекрасным тренером Davide, конным спортом, что большая редкость, водными лыжами, футболом. Для взрослых есть возможность заняться стрельбой, гольфом, съездить на рыбалку и многим другим. | 0.844155 |
In [ ]:
# df_init.to_parquet(project_root / "data" / "interim" / "LDA_data.parquet")